/*
* 
* Fichier source projet pac-man.
* 
* Cree le : vendredi 18 novembre 2011 à 09 : 10.
* Auteurs : Gregoire BARRET.
* 
* Nom de fichier : reseau.c
* Chemin du fichier : ../trunk/reseau/reseau.c
* 
* Description :
* 
*/


#include "reseau.h"




void* ecoute_sockette(void *data)
{
	/*initialisation des threads*/
	pthread_t thread_travail;
	int i =0;
	struct Struct_Carte *str_carte = (struct Struct_Carte *) data;

	/*initialisation des sockets*/
	int prim_sock;
	struct sockaddr_in serveur_addr, client_addr;
	int addrlength;

	bzero(&serveur_addr, sizeof(serveur_addr));
	serveur_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	serveur_addr.sin_family = AF_INET;
	serveur_addr.sin_port = htons(str_carte->port);// 44444 est le num de port. il faut le configurer avec le port du fichier de conf

	if((prim_sock = socket(AF_INET, SOCK_STREAM, 0))== -1)
	{
		printf("echeque créetion socket serveur\n");
		exit(0);
	}



	bind( prim_sock, (struct sockaddr *) & serveur_addr, sizeof(serveur_addr));
	
	while (i < str_carte->nbjoueur) // a remplacer par le nombre de joueurs
	{
		listen(prim_sock,10); //le parrametre 10 indique le nombres maxi de clien en attente, il faut le ramener au nombre de joueurs
		addrlength = sizeof(client_addr);

		printf("attente d'une demande de connection\n");
		str_carte->socket_travaille = accept( prim_sock, (struct sockaddr *)& client_addr, &addrlength);

		str_carte->joueur = i;
		printf("sockette de travaille accepter \n");
		pthread_create(&thread_travail, NULL, travaille_sockette, (void*)str_carte);	
		while( str_carte->socket_travaille != -2)
		{
			sched_yield();
		}
		i++;
	}
	str_carte->joueur = i;
	printf("fermeture de la connection principal\n");
	close(prim_sock);
	return NULL;
}

/*focntion de travaille sur une sockette quand la connection est etablie*/
void* travaille_sockette(void *data)
{
	int socktravail;
	int *data2;
	struct Struct_Carte *str_carte = (struct Struct_Carte *) data;
	char carte_envoi;
	int i,j;
	char char_recu[1];
	int joueur;
	char temp[6];
	char pointsj1[6];
	char pointsj2[6];
	char viej1[2];
	char viej2[2];

	printf("creation d'une socket de travail\n");
	socktravail = str_carte->socket_travaille;
	str_carte->socket_travaille = -2;

	joueur = str_carte->joueur;

	//ajout de la ligne 26
	for (i=0;i<25;i++)
	{
		if (i==6 || i==9 || i==16 || i==19){ str_carte->carte[25][i]=' ';}
		else{ str_carte->carte[25][i] = '2';}
	}
	
	//attente du 2eme joueur
	while( str_carte->joueur < str_carte->nbjoueur) { 
		send(socktravail, str_carte->carte, sizeof(str_carte->carte), 0);
		recv(socktravail, char_recu, sizeof(char_recu),0);
		usleep (100);}




	do{
		send(socktravail, str_carte->carte, sizeof(str_carte->carte), 0);
		recv(socktravail, char_recu, sizeof(char_recu),0);
		deplacements(*char_recu, str_carte, joueur );//mise a jour du deplacement

		/*ecriture de la derniere ligne*/
		sprintf( pointsj1, "%d", str_carte->joueur1.score);
		sprintf( viej1, "%d", str_carte->joueur1.vie);
		sprintf( pointsj2, "%d", str_carte->joueur2.score);
		sprintf( viej2, "%d", str_carte->joueur2.vie);
		for (i=0;i<25;i++)
		{
			if (i==6 || i == 9 || i==16 || i==19){ str_carte->carte[25][i]= ' ';}
			else if (i<6){str_carte->carte[25][i] = pointsj1[i];}
			else if ((i>6)&&(i<9)){str_carte->carte[25][i] = viej1[i-7];}
			else if ((i>9)&&(i<16)){str_carte->carte[25][i] = pointsj2[i-10];}
			else if ((i>16)&&(i<19)){str_carte->carte[25][i] = viej2[i-17];}
			else {str_carte->carte[25][i] = ' ';}
			if( str_carte->carte[25][i] == '\0' ) { str_carte->carte[25][i] = '0'; }
	

		//	printf("%c",str_carte->carte[25][i]);
		}
		//	printf("\n");
		/*fin ecriture*/

	}while(str_carte->connect == 1);
}


